# 装饰器雏形
# def wrapper(fn):
#     def inner():
#         print("开挂")
#         fn()
#         print("关闭外挂")
#     return inner


# @wrapper
# def dnf():
#     print("我要玩DNF")


# dnf()


# 如果被装饰器的函数有参数
# def wrapper(fn):
#     def inner(*args, **kwargs):  # 任意的参数都能接受
#         print("开挂")
#         fn(*args, **kwargs)
#         print("关闭外挂")
#     return inner


# @wrapper  # dnf = wrapper(dnf)
# def dnf(username, password):
#     print(f"登录账户为{username}, {password}:我要玩DNF")


# @wrapper
# def wz(wx):
#     print(f"使用账号{wx}登录王者荣耀")


# dnf("admin", "123")  # 这里执行的是inner inner没有参数
# wz("静")


# 如果目标函数带有返回值
# def wrapper(fn):
#     def inner(*args, **kwargs):  # 任意的参数都能接受
#         print("开挂")
#         ret = fn(*args, **kwargs)  # 目标函数执行之后可能会有返回值
#         print("关闭外挂")
#         return ret
#     return inner


# @wrapper  # dnf = wrapper(dnf)
# def dnf(username, password):
#     print(f"登录账户为{username}, {password}:我要玩DNF")
#     return "烈焰梵天剑"


# @wrapper
# def wz(wx):
#     print(f"使用账号{wx}登录王者荣耀")


# ret = dnf("admin", "123")  # 这里执行的是inner inner没有参数
# print(ret)
# wz("静")

# 通用装饰器的写法
# def wrapper(fn):
#     def inner(*args, **kwargs):
#         # 在执行目标函数之前
#         ret = fn(*args, **kwargs)  # 处理目标函数返回值
#         # 在执行目标函数之后
#         return ret
#     return inner


# @wrapper
# def target():
#     pass


# target()

# 装饰器的应用
# 写装饰器 在执行目标函数的时候 判断是否登录
flag = False

def login_wrapper(fn):  # 把被装饰的函数传递进来
    """
    这里是登录验证的装饰器
    :param fn: 被装饰的函数
    :return: inner
    """
    def inner(*args, **kwargs):
        global flag
        while 1:  # 反复的判断登录状态
            if flag:
                ret = fn(*args, **kwargs)  # 执行被装饰的函数
                return ret  # 返回结果
            else:
                login()
    return inner  # 把内层函数返回


def login():
    global flag
    username = input(">>>:")
    passwrod = input(">>>:")
    if username == "admin" and passwrod == "123":
        flag = True
        print("登录成功")
    else:
        print("登录失败!")


# 语法糖
@login_wrapper
def add():
    print("我是新增函数")


add()
